/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package session;

import entities.CompteBancaire;
import java.util.List;
import java.util.Map;
import javax.ejb.LocalBean;
import javax.ejb.Schedule;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Gael
 */
@Stateless
@LocalBean
public class GestionnaireDeCompteBancaire {
    @PersistenceContext(unitName = "ARTP3-ejbPU")
    private EntityManager em;

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
   
    @Schedule(second="*/10", minute="*", hour="*")
    public void setInteret() {
        System.out.println("lol");
        for(CompteBancaire c : getAllComptes()){
            if(c.getType().getLibelleType().equals("Livret A")){
                c.setSolde(c.getSolde() + 20);
                System.out.println("Compte num : "+c.getId());
                update(c);
            }
        }
        
    }

    public void creerComptesTest() {  
        creerCompte(new CompteBancaire("John Lennon", 10000));  
        creerCompte(new CompteBancaire("Cartney", 10000));  
        creerCompte(new CompteBancaire("Ringo Starr", 10000));  
        creerCompte(new CompteBancaire("Georges Harrisson", 10000));  
        creerCompte(new CompteBancaire("Gael Francillette", 10000));  
}  

    public List<CompteBancaire> getAllComptes() {
        Query query = em.createNamedQuery("CompteBancaire.findAll");
        return query.getResultList();
    }
    
    public List<CompteBancaire> getLazyComptes(int start, int nbComptes, String sortField, String sortOrder){
        System.out.println("gestionnaire compte getLazyComptes");
        String req = "select cb from CompteBancaire cb";
        if(sortField != null){
            String sens = "ASC";
            if(!sortOrder.equals("ASCENDING")){
                sens = "DESC";
            }
            req += " ORDER BY cb."+sortField+" "+sens;
        }
        System.out.println(req);
        Query query = em.createQuery(req);
        
        query.setFirstResult(start);
        query.setMaxResults(nbComptes);
        try{
            return query.getResultList();
        }catch(Exception e){
            System.out.println("Erreur requete pour:"+e.getMessage());
            return null;
        }
    }
    
    public List<CompteBancaire> getLikeThat(String q) {
        System.out.println("Requette autocomplete ++++++++++++++++++++++++");
        Query query = em.createNamedQuery("CompteBancaire.search");
        query.setParameter("query", "%"+q+"%");
        try{
            return query.getResultList();
        }catch(Exception e){
            System.out.println("Erreur getLikethat pour:"+q);
            return null;
        }
        
    }
    public CompteBancaire getCompteById(Long id){
        System.out.println("Alloooooooooooooooooo");
        Query query = em.createNamedQuery("CompteBancaire.findById");  
        query.setParameter("compteid", id); 
        try{
            
            return (CompteBancaire) query.getSingleResult(); 
        }catch(Exception e){
            System.out.println("ID inexistant");
            return null;
        }
    }
    
    public CompteBancaire getCompteByProprietaire(String p){
        System.out.print("############################# le nom du prop selectionné : "+p);
        Query query = em.createNamedQuery("CompteBancaire.findByProprio");  
        query.setParameter("proprio", p);  
        try{
           return (CompteBancaire) query.getSingleResult();  
        }catch(Exception e){
            System.err.println("Erreur recherche proprietaire par nom :"+p+":");
            return null;
        }  
    }
    public CompteBancaire getCompteByProprietaire(char p){
        Query query = em.createNamedQuery("CompteBancaire.findByProprio");  
        query.setParameter("proprio", p); 
        try{
           return (CompteBancaire) query.getSingleResult();  
        }catch(Exception e){
            System.err.println("Erreur recherche proprietaire par nom :"+p+":");
            return null;
        }
         
    }
    
    public int getNBComptes(){
        Query query = em.createNamedQuery("CompteBancaire.nbComptes");
        
        return ((Long) query.getSingleResult()).intValue();
    }
    
    public void creerCompte(CompteBancaire c) {
        this.persist(c);
        em.flush();
    }

    public void persist(Object object) {
        em.persist(object);
        em.flush();
    }

    public CompteBancaire update(CompteBancaire c) {
        CompteBancaire cb = em.merge(c);
        em.flush();
        return cb;
    }
    
    public void delete(CompteBancaire c) {
        System.err.println("delete nom :"+c.getProprietaire());
        CompteBancaire cb = getCompteById(Long.parseLong(c.getId().toString()));
        em.remove(cb);
    }
}
